home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / StarTrekker4AM.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  16.0 KB  |  923 lines

  1.  
  2.     incdir    "Includes:"
  3.     include "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: StarTrekker AM 4 Voices 1.2 player module V1.3 (14 Aug 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,0
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_ExtLoad,Load
  22.     dc.l    DTP_Interrupt,Int
  23.     dc.l    DTP_InitPlayer,InitPlay
  24.     dc.l    DTP_EndPlayer,EndPlay
  25.     dc.l    DTP_InitSound,mt_init
  26.     dc.l    DTP_EndSound,mt_end
  27.     dc.l    TAG_DONE
  28.  
  29. *-----------------------------------------------------------------------*
  30. ;
  31. ; Player/Creatorname und lokale Daten
  32.  
  33. PName    dc.b 'StarTrekker4AM',0
  34. CName    dc.b 'Bjoern Wesen / Exolon of Fairlight,',10
  35.     dc.b 'adapted by Delirium',0
  36.     even
  37.  
  38. NTSuffixTxt    dc.b '.NT',0
  39.     even
  40. mt_data        dc.l 0
  41. mt_size        dc.l 0
  42.  
  43. mt_data2    dc.l 0
  44. mt_size2    dc.l 0
  45.  
  46. mt_songend    dc.l 0
  47.  
  48. *-----------------------------------------------------------------------*
  49. ;
  50. ;Interrupt für Replay
  51.  
  52. Int
  53.     movem.l    d0-d7/a0-a6,-(sp)
  54.     bsr    mt_music            ; DudelDiDum
  55.     movem.l    (sp)+,d0-d7/a0-a6
  56.     rts
  57.  
  58. *-----------------------------------------------------------------------*
  59. ;
  60. ; Testet auf Modul
  61.  
  62. Chk                        ; StarTrekker-AM ?
  63.     move.l    dtg_ChkData(a5),a0
  64.  
  65.     cmpi.l    #"FLT4",$438(a0)        ; StarTrekker 4 Voices
  66.     beq    ChkMod
  67.  
  68.     cmpi.l    #"EXO4",$438(a0)        ; StarTrekker 4 Voices
  69.     bne    ChkFail
  70. ChkMod
  71.     lea    $3b8(a0),a1
  72.     moveq    #$7F,d0
  73.     moveq    #0,d1
  74.     moveq    #0,d2
  75. ChkPatt                        ; find biggest pattern
  76.     move.b    (a1)+,d1
  77.     bmi.s    ChkFail                ; pattern too large
  78.     cmp.b    d2,d1
  79.     ble.s    ChkBigPatt
  80.     move.l    d1,d2
  81. ChkBigPatt
  82.     dbra    d0,ChkPatt
  83.  
  84.     addq.w    #1,d2                ; bigpat + 1
  85.     asl.l    #8,d2                ; bigpat * 1024
  86.     asl.l    #2,d2
  87.     addi.l    #$43c,d2
  88.     moveq    #0,d3
  89.     moveq    #30,d0
  90. Chkloop
  91.     moveq    #0,d1
  92.     move.w    $2A(a0),d1            ; samplelen
  93.     bne.s    Chksamp
  94.     tst.b    $2D(a0)                ; volume
  95.     beq.s    Chksamp
  96.     addq.w    #1,d3
  97. Chksamp
  98.     asl.l    #1,d1                ; samplelen * 2
  99.     add.l    d1,d2                ; add
  100.     lea    $1E(a0),a0            ; next instr
  101.     dbra    d0,Chkloop
  102.  
  103.     tst.w    d3
  104.     beq.s    ChkFail                ; no am samples found !
  105.  
  106.     sub.l    dtg_ChkSize(a5),d2        ; test size of module
  107.     cmpi.l    #-256,d2            ; - 256 Bytes
  108.     blt.s    ChkFail                ; too small
  109.     cmpi.l    #+256,d2            ; + 256 Bytes
  110.     bgt.s    ChkFail                ; too big
  111.  
  112.     moveq    #0,d0                ; Modul erkannt
  113.     bra.s    ChkEnd
  114. ChkFail
  115.     moveq    #-1,d0                ; Modul nicht erkannt
  116. ChkEnd
  117.     rts
  118.  
  119. *-----------------------------------------------------------------------*
  120. ;
  121. ; StarTrekker laden
  122.  
  123. Load
  124.     move.l    dtg_PathArrayPtr(a5),a0
  125.     clr.b    (a0)                ; clear Path
  126.  
  127.     move.l    dtg_CopyDir(a5),a0        ; copy dir into patharray
  128.     jsr    (a0)
  129.  
  130.     move.l    dtg_CopyFile(a5),a0        ; append filename
  131.     jsr    (a0)
  132.  
  133.     move.l    dtg_CutSuffix(a5),a0        ; remove '.pp' suffix if necessary
  134.     jsr    (a0)
  135.  
  136.     lea    NTSuffixTxt(pc),a0        ; join '.NT'
  137.     move.l    dtg_CopyString(a5),a1
  138.     jsr    (a1)
  139.  
  140.     move.l    dtg_LoadFile(a5),a0
  141.     jsr    (a0)                ; returncode is already set !
  142.     rts
  143.  
  144. *-----------------------------------------------------------------------*
  145. ;
  146. ; Init Player
  147.  
  148. InitPlay
  149.     moveq    #0,d0
  150.     move.l    dtg_GetListData(a5),a0        ; Function
  151.     jsr    (a0)
  152.     move.l    a0,mt_data
  153.     move.l    d0,mt_size
  154.  
  155.     moveq    #1,d0
  156.     move.l    dtg_GetListData(a5),a0        ; Function
  157.     jsr    (a0)
  158.     move.l    a0,mt_data2
  159.     move.l    d0,mt_size2
  160.  
  161.     move.l    dtg_SongEnd(a5),mt_songend    ; store Songend FunctionPtr
  162.  
  163.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  164.     jsr    (a0)                ; returncode is already set !
  165.     rts
  166.  
  167. *-----------------------------------------------------------------------*
  168. ;
  169. ; End Player
  170.  
  171. EndPlay
  172.     move.l    dtg_AudioFree(a5),a0        ; Function
  173.     jsr    (a0)
  174.     rts
  175.  
  176. *-----------------------------------------------------------------------*
  177. ;
  178. ; STARTREKKER 1.2      AM REPLAYROUTINE
  179. ;
  180. ; BY BJOERN WESEN / EXOLON OF FAIRLIGHT
  181.  
  182.  
  183. ; Call mt_init, then mt_music each frame, call mt_end to stop
  184.  
  185. ; NOTE! The mt_amwaveforms have to reside in CHIPMEM! Therefore the ORG
  186. ;       below...
  187.  
  188. mt_init:
  189.     move.l    mt_data,a0
  190.     lea    $3b8(a0),a1
  191.     moveq    #$7f,d0
  192.     moveq    #0,d2
  193.     moveq    #0,d1
  194. mt_lop2:move.b    (a1)+,d1
  195.     cmp.b    d2,d1
  196.     ble.s    mt_lop
  197.     move.l    d1,d2
  198. mt_lop:    dbf    d0,mt_lop2
  199.     addq.b    #1,d2
  200.  
  201.     asl.l    #8,d2
  202.     asl.l    #2,d2
  203.     lea    4(a1,d2.l),a2
  204.     lea    mt_samplestarts(pc),a1
  205.     add.l    #42,a0
  206.     move.l    a0,a3
  207.     add.l    mt_size(pc),a3
  208.     moveq    #$1e,d0
  209. mt_lop3:cmp.l    a3,a2
  210.     bcc.s    mt_lop4
  211.     clr.l    (a2)
  212. mt_lop4:move.l    a2,(a1)+
  213.     moveq    #0,d1
  214.     move.w    (a0),d1
  215.     clr.b    2(a0)
  216.     asl.l    #1,d1
  217.     add.l    d1,a2
  218.     add.l    #30,a0
  219.     dbf    d0,mt_lop3
  220.  
  221. ;    or.b    #2,$bfe001
  222.     move.b    #6,mt_speed
  223.     moveq    #0,d0
  224.     lea    $dff000,a0
  225.     move.w    d0,$a8(a0)
  226.     move.w    d0,$b8(a0)
  227.     move.w    d0,$c8(a0)
  228.     move.w    d0,$d8(a0)
  229.     clr.b    mt_songpos
  230.     clr.b    mt_counter
  231.     clr.w    mt_pattpos
  232.     rts
  233.  
  234. mt_end:
  235.     clr.w    $dff0a8
  236.     clr.w    $dff0b8
  237.     clr.w    $dff0c8
  238.     clr.w    $dff0d8
  239.     move.w    #$f,$dff096
  240.     rts
  241.  
  242. mt_music:
  243.     move.l    mt_data,a0
  244.     addq.b    #1,mt_counter
  245.     move.b    mt_counter(pc),d0
  246.     cmp.b    mt_speed(pc),d0
  247.     blt    mt_nonew
  248.     clr.b    mt_counter
  249.  
  250.     move.l    mt_data,a0
  251.     lea    $c(a0),a3
  252.     lea    $3b8(a0),a2
  253.     lea    $43c(a0),a0
  254.  
  255.     moveq    #0,d0
  256.     moveq    #0,d1
  257.     move.b    mt_songpos(pc),d0
  258.     move.b    (a2,d0.w),d1
  259.     lsl.w    #8,d1
  260.     lsl.w    #2,d1
  261.     add.w    mt_pattpos(pc),d1
  262.     clr.w    mt_dmacon
  263.  
  264.     lea    $dff0a0,a5
  265.     lea    mt_voice1(pc),a4
  266.     bsr    mt_playvoice
  267.     addq.l    #4,d1
  268.     lea    $dff0b0,a5
  269.     lea    mt_voice2(pc),a4
  270.     bsr    mt_playvoice
  271.     addq.l    #4,d1
  272.     lea    $dff0c0,a5
  273.     lea    mt_voice3(pc),a4
  274.     bsr    mt_playvoice
  275.     addq.l    #4,d1
  276.     lea    $dff0d0,a5
  277.     lea    mt_voice4(pc),a4
  278.     bsr    mt_playvoice
  279.  
  280.     bsr    mt_wait
  281.     move.w    mt_dmacon(pc),d0
  282.     or.w    #$8000,d0
  283.     move.w    d0,$dff096
  284.     bsr    mt_wait
  285. mt_nodma:
  286.     lea    $dff000,a3
  287.     lea    mt_voice1(pc),a4
  288.     move.l    $a(a4),$a0(a3)
  289.     move.w    $e(a4),$a4(a3)
  290.     tst.w    30(a4)
  291.     bne.s    mt_nov1
  292.     move.w    $12(a4),$a8(a3)
  293. mt_nov1:lea    mt_voice2(pc),a4
  294.     move.l    $a(a4),$b0(a3)
  295.     move.w    $e(a4),$b4(a3)
  296.     tst.w    30(a4)
  297.     bne.s    mt_nov2
  298.     move.w    $12(a4),$b8(a3)
  299. mt_nov2:lea    mt_voice3(pc),a4
  300.     move.l    $a(a4),$c0(a3)
  301.     move.w    $e(a4),$c4(a3)
  302.     tst.w    30(a4)
  303.     bne.s    mt_nov3
  304.     move.w    $12(a4),$c8(a3)
  305. mt_nov3:lea    mt_voice4(pc),a4
  306.     move.l    $a(a4),$d0(a3)
  307.     tst.w    30(a4)
  308.     bne.s    mt_nov4
  309.     move.w    $e(a4),$d4(a3)
  310.     move.w    $12(a4),$d8(a3)
  311.  
  312. mt_nov4:add.w    #$10,mt_pattpos
  313.     cmp.w    #$400,mt_pattpos
  314.     bne.s    mt_exit
  315. mt_next:clr.w    mt_pattpos
  316.     clr.b    mt_break
  317.     move.l    mt_data,a0
  318.     addq.b    #1,mt_songpos
  319.     and.b    #$7f,mt_songpos
  320.     move.b    $3b6(a0),d0
  321.     cmp.b    mt_songpos(pc),d0
  322.     bne.s    mt_exit
  323.     move.b    $3b7(a0),mt_songpos
  324.     move.l    mt_songend(pc),a0
  325.     jsr    (a0)            ; signal songend
  326. mt_exit:tst.b    mt_break
  327.     bne.s    mt_next
  328.     bra    mt_amhandler
  329.  
  330. mt_wait:moveq    #4,d3        
  331. mt_wai2:move.b    $dff006,d2    
  332. mt_wai3:cmp.b    $dff006,d2    
  333.     beq.s    mt_wai3
  334.     dbf    d3,mt_wai2    
  335.     moveq    #8,d2
  336. mt_wai4:dbf    d2,mt_wai4
  337.     rts
  338.  
  339. mt_nonew:
  340.     lea    mt_voice1(pc),a4
  341.     lea    $dff0a0,a5
  342.     bsr    mt_com
  343.     lea    mt_voice2(pc),a4
  344.     lea    $dff0b0,a5
  345.     bsr    mt_com
  346.     lea    mt_voice3(pc),a4
  347.     lea    $dff0c0,a5
  348.     bsr    mt_com
  349.     lea    mt_voice4(pc),a4
  350.     lea    $dff0d0,a5
  351.     bsr    mt_com
  352.     bra.s    mt_exit
  353.  
  354. mt_mulu:
  355.     dc.w    0,$1e,$3c,$5a,$78,$96,$b4,$d2,$f0,$10e,$12c,$14a
  356.     dc.w    $168,$186,$1a4,$1c2,$1e0,$1fe,$21c,$23a,$258,$276
  357.     dc.w    $294,$2b2,$2d0,$2ee,$30c,$32a,$348,$366,$384,$3a2
  358.  
  359. mt_playvoice:
  360.     move.l    (a0,d1.l),(a4)
  361.     moveq    #0,d2
  362.     move.b    2(a4),d2
  363.     lsr.b    #4,d2
  364.     move.b    (a4),d0
  365.     and.b    #$f0,d0
  366.     or.b    d0,d2
  367.     beq    mt_oldinstr
  368.  
  369.     lea    mt_samplestarts-4(pc),a1
  370.     move.w    d2,34(a4)
  371.     move.w    d2,d0
  372.     mulu    #120,d0
  373.     move.l    a0,-(sp)
  374.     move.l    mt_data2,a0
  375.     lea    24(a0,d0.l),a0
  376.     clr.w    30(a4)
  377.     cmp.w    #"AM",(a0)
  378.     bne.s    mt_noa9
  379.     move.w    6(a0),d0
  380.     lsr.w    #2,d0
  381.     st    30(a4)
  382. mt_noa9:move.l    (sp)+,a0
  383.  
  384.     asl.w    #2,d2
  385.     move.l    (a1,d2.l),4(a4)
  386.     lsr.w    #2,d2
  387.     mulu    #30,d2
  388.     move.w    (a3,d2.w),8(a4)
  389.     tst.w    30(a4)
  390.     beq.s    mt_noa8
  391.     move.w    d0,$12(a4)
  392.     bra.s    mt_noa7
  393. mt_noa8:move.w    2(a3,d2.w),$12(a4)
  394. mt_noa7:moveq    #0,d3
  395.     move.w    4(a3,d2.w),d3
  396.     tst.w    d3
  397.     beq.s    mt_noloop
  398.     move.l    4(a4),d0
  399.     asl.w    #1,d3
  400.     add.l    d3,d0
  401.     move.l    d0,$a(a4)
  402.     move.w    4(a3,d2.w),d0
  403.     add.w    6(a3,d2.w),d0
  404.     move.w    d0,8(a4)
  405.     bra.s    mt_hejaSverige
  406. mt_noloop:
  407.     move.l    4(a4),d0
  408.     add.l    d3,d0
  409.     move.l    d0,$a(a4)
  410. mt_hejaSverige:
  411.     move.w    6(a3,d2.w),$e(a4)
  412.  
  413. mt_oldinstr:
  414.     move.w    (a4),d0
  415.     and.w    #$fff,d0
  416.     beq    mt_com2
  417.     tst.w    30(a4)
  418.     bne.s    mt_rambo
  419.     tst.w    8(a4)
  420.     beq    mt_stopsound
  421.     tst.b    $12(a4)
  422.     bne    mt_stopsound
  423.     move.b    2(a4),d0
  424.     and.b    #$f,d0
  425.     cmp.b    #5,d0
  426.     beq    mt_setport
  427.     cmp.b    #3,d0
  428.     beq    mt_setport
  429.  
  430. mt_rambo:
  431.     move.w    (a4),$10(a4)
  432.     and.w    #$fff,$10(a4)
  433.     move.w    $1a(a4),$dff096
  434.     clr.b    $19(a4)
  435.  
  436.     tst.w    30(a4)
  437.     beq.s    mt_noaminst
  438.     move.l    a0,-(sp)
  439.     move.w    34(a4),d0
  440.     mulu    #120,d0
  441.  
  442.     move.l    mt_data2,a0
  443.     lea    24(a0,d0.l),a0
  444.  
  445.     moveq    #0,d0
  446.     move.w    26(a0),d0
  447.     lsl.w    #5,d0
  448.     add.l    #mt_amwaveforms,d0
  449.     move.l    d0,(a5)
  450.     move.w    #16,4(a5)
  451.     move.l    d0,$a(a4)
  452.     move.w    #16,$e(a4)
  453.     move.w    6(a0),32(a4)
  454.     move.l    #1,36(a4)
  455.     move.w    34(a0),d0
  456.     move.w    d1,-(sp)
  457.     move.w    $10(a4),d1
  458.     lsl.w    d0,d1
  459.     move.w    d1,$10(a4)
  460.     move.w    d1,6(a5)
  461.     move.w    (sp)+,d1
  462.     move.l    (sp)+,a0
  463.     bra.s    mt_juck
  464.  
  465. mt_noaminst:
  466.     move.l    4(a4),(a5)
  467.     move.w    8(a4),4(a5)
  468.     move.w    $10(a4),6(a5)
  469.  
  470. mt_juck:move.w    $1a(a4),d0
  471.     or.w    d0,mt_dmacon
  472.     bra    mt_com2
  473.  
  474. mt_stopsound:
  475.     move.w    $1a(a4),$dff096
  476.     bra    mt_com2
  477.  
  478. mt_setport:
  479.     move.w    (a4),d2
  480.     and.w    #$fff,d2
  481.     move.w    d2,$16(a4)
  482.     move.w    $10(a4),d0
  483.     clr.b    $14(a4)
  484.     cmp.w    d0,d2
  485.     beq.s    mt_clrport
  486.     bge    mt_com2
  487.     move.b    #1,$14(a4)
  488.     bra    mt_com2
  489. mt_clrport:
  490.     clr.w    $16(a4)
  491.     rts
  492.  
  493. mt_port:move.b    3(a4),d0
  494.     beq.s    mt_port2
  495.     move.b    d0,$15(a4)
  496.     clr.b    3(a4)
  497. mt_port2:
  498.     tst.w    $16(a4)
  499.     beq.s    mt_rts
  500.     moveq    #0,d0
  501.     move.b    $15(a4),d0
  502.     tst.b    $14(a4)
  503.     bne.s    mt_sub
  504.     add.w    d0,$10(a4)
  505.     move.w    $16(a4),d0
  506.     cmp.w    $10(a4),d0
  507.     bgt.s    mt_portok
  508.     move.w    $16(a4),$10(a4)
  509.     clr.w    $16(a4)
  510. mt_portok:
  511.     move.w    $10(a4),6(a5)
  512. mt_rts:    rts
  513.  
  514. mt_sub:    sub.w    d0,$10(a4)
  515.     move.w    $16(a4),d0
  516.     cmp.w    $10(a4),d0
  517.     blt.s    mt_portok
  518.     move.w    $16(a4),$10(a4)
  519.     clr.w    $16(a4)
  520.     move.w    $10(a4),6(a5)
  521.     rts
  522.  
  523. mt_sin:    dc.b    0,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4
  524.     dc.b    $fa,$fd
  525.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61
  526.     dc.b    $4a,$31,$18
  527.  
  528. mt_vib:    move.b    $3(a4),d0
  529.     beq.s    mt_vib2
  530.     move.b    d0,$18(a4)
  531.  
  532. mt_vib2:move.b    $19(a4),d0
  533.     lsr.w    #2,d0
  534.     and.w    #$1f,d0
  535.     moveq    #0,d2
  536.     move.b    mt_sin(pc,d0.w),d2
  537.     move.b    $18(a4),d0
  538.     and.w    #$f,d0
  539.     mulu    d0,d2
  540.     lsr.w    #7,d2
  541.     move.w    $10(a4),d0
  542.     tst.b    $19(a4)
  543.     bmi.s    mt_vibsub
  544.     add.w    d2,d0
  545.     bra.s    mt_vib3
  546. mt_vibsub:
  547.     sub.w    d2,d0
  548. mt_vib3:move.w    d0,6(a5)
  549.     move.b    $18(a4),d0
  550.     lsr.w    #2,d0
  551.     and.w    #$3c,d0
  552.     add.b    d0,$19(a4)
  553.     rts
  554.  
  555. mt_arplist:
  556.     dc.b    0,1,2,0,1,2,0,1,2,0,1,2,0
  557.     dc.b    1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  558.  
  559. mt_arp:    moveq    #0,d0
  560.     move.b    mt_counter(pc),d0
  561.     move.b    mt_arplist(pc,d0.w),d0
  562.     beq.s    mt_arp0
  563.     cmp.b    #2,d0
  564.     beq.s    mt_arp2
  565. mt_arp1:moveq    #0,d0
  566.     move.b    3(a4),d0
  567.     lsr.b    #4,d0
  568.     bra.s    mt_arpdo
  569. mt_arp2:moveq    #0,d0
  570.     move.b    3(a4),d0
  571.     and.b    #$f,d0
  572. mt_arpdo:
  573.     asl.w    #1,d0
  574.     move.w    $10(a4),d1
  575.     and.w    #$fff,d1
  576.     lea    mt_periods(pc),a0
  577.     moveq    #$24,d2
  578. mt_arp3:cmp.w    (a0)+,d1
  579.     bge.s    mt_arpfound
  580.     dbf    d2,mt_arp3
  581. mt_arp0:move.w    $10(a4),6(a5)
  582.     rts
  583. mt_arpfound:
  584.     move.w    -2(a0,d0.w),6(a5)
  585.     rts
  586.  
  587. mt_normper:
  588.     move.w    $10(a4),6(a5)
  589.     rts
  590.  
  591. mt_com:    move.w    2(a4),d0
  592.     and.w    #$fff,d0
  593.     beq.s    mt_normper
  594.     move.b    2(a4),d0
  595.     and.b    #$f,d0
  596.     tst.b    d0
  597.     beq.s    mt_arp
  598.     cmp.b    #1,d0
  599.     beq.s    mt_portup
  600.     cmp.b    #2,d0
  601.     beq.s    mt_portdown
  602.     cmp.b    #3,d0
  603.     beq    mt_port
  604.     cmp.b    #4,d0
  605.     beq    mt_vib
  606.     cmp.b    #5,d0
  607.     beq.s    mt_volport
  608.     cmp.b    #6,d0
  609.     beq.s    mt_volvib
  610.     move.w    $10(a4),6(a5)
  611.     cmp.b    #$a,d0
  612.     beq.s    mt_volslide
  613.     rts
  614.  
  615. mt_portup:
  616.     moveq    #0,d0
  617.     move.b    3(a4),d0
  618.     sub.w    d0,$10(a4)
  619.     move.w    $10(a4),d0
  620.     cmp.w    #$71,d0
  621.     bpl.s    mt_portup2
  622.     move.w    #$71,$10(a4)
  623. mt_portup2:
  624.     move.w    $10(a4),6(a5)
  625.     rts
  626.  
  627. mt_portdown:
  628.     moveq    #0,d0
  629.     move.b    3(a4),d0
  630.     add.w    d0,$10(a4)
  631.     move.w    $10(a4),d0
  632.     cmp.w    #$358,d0
  633.     bmi.s    mt_portdown2
  634.     move.w    #$358,$10(a4)
  635. mt_portdown2:
  636.     move.w    $10(a4),6(a5)
  637.     rts
  638.  
  639. mt_volvib:
  640.      bsr    mt_vib2
  641.      bra.s    mt_volslide
  642. mt_volport:
  643.      bsr    mt_port2
  644.  
  645. mt_volslide:
  646.     moveq    #0,d0
  647.     move.b    3(a4),d0
  648.     lsr.b    #4,d0
  649.     beq.s    mt_vol3
  650.     add.b    d0,$13(a4)
  651.     cmp.b    #$40,$13(a4)
  652.     bmi.s    mt_vol2
  653.     move.b    #$40,$13(a4)
  654. mt_vol2:moveq    #0,d0
  655.     move.b    $13(a4),d0
  656.     move.w    d0,8(a5)
  657.     rts
  658.  
  659. mt_vol3:move.b    3(a4),d0
  660.     and.b    #$f,d0
  661.     sub.b    d0,$13(a4)
  662.     bpl.s    mt_vol4
  663.     clr.b    $13(a4)
  664. mt_vol4:moveq    #0,d0
  665.     move.b    $13(a4),d0
  666.     move.w    d0,8(a5)
  667.     rts
  668.  
  669. mt_com2:move.b    $2(a4),d0
  670.     and.b    #$f,d0
  671.     cmp.b    #$e,d0
  672.     beq.s    mt_filter
  673.     cmp.b    #$d,d0
  674.     beq.s    mt_pattbreak
  675.     cmp.b    #$b,d0
  676.     beq.s    mt_songjmp
  677.     cmp.b    #$c,d0
  678.     beq.s    mt_setvol
  679.     cmp.b    #$f,d0
  680.     beq.s    mt_setspeed
  681.     rts
  682.  
  683. mt_filter:
  684.     move.b    3(a4),d0
  685.     and.b    #1,d0
  686.     asl.b    #1,d0
  687.     and.b    #$fd,$bfe001
  688.     or.b    d0,$bfe001
  689.     rts
  690.  
  691. mt_pattbreak:
  692.     move.b    #1,mt_break
  693.     rts
  694.  
  695. mt_songjmp:
  696.     move.b    mt_songpos,d0
  697.     addq.b    #1,d0
  698.     move.l    mt_data,a6
  699.     cmp.b    $3b6(a6),d0
  700.     bne.s    mt_sj2
  701.     move.l    mt_songend(pc),a6
  702.     jsr    (a6)            ; signal songend
  703. mt_sj2    move.b    3(a4),d0
  704.     subq.b    #1,d0
  705.     move.b    d0,mt_songpos
  706.     bne.s    mt_sj3
  707.     move.l    mt_songend(pc),a6
  708.     jsr    (a6)            ; signal songend
  709. mt_sj3    move.b    #1,mt_break
  710.     rts
  711.  
  712. mt_setvol:
  713.     cmp.b    #$40,3(a4)
  714.     bls.s    mt_sv2
  715.     move.b    #$40,3(a4)
  716. mt_sv2:    moveq    #0,d0
  717.     move.b    3(a4),d0
  718.     move.b    d0,$13(a4)
  719.     move.w    d0,8(a5)
  720.     rts
  721.  
  722. mt_setspeed:
  723.     moveq    #0,d0
  724.     move.b    3(a4),d0
  725.     cmp.b    #$1f,d0
  726.     bls.s    mt_sp2
  727.     moveq    #$1f,d0
  728. mt_sp2:    tst.w    d0
  729.     bne.s    mt_sp3
  730.     moveq    #1,d0
  731. mt_sp3:    move.b    d0,mt_speed
  732.     rts
  733.  
  734. mt_amhandler:
  735.     moveq    #3,d7
  736.     lea    mt_voice1,a6
  737.     lea    $dff0a0,a5
  738. mt_amloop:
  739.     tst.w    30(a6)
  740.     beq    mt_anrp
  741.     move.w    34(a6),d0
  742.     mulu    #120,d0
  743.     move.l    mt_data2,a0
  744.     lea    24(a0,d0.l),a0
  745.  
  746.     tst.w    38(a6)
  747.     beq    mt_anrp
  748.     cmp.w    #1,38(a6)
  749.     bne.s    mt_anat
  750.     move.w    32(a6),d0
  751.     cmp.w    8(a0),d0
  752.     beq.s    mt_aaeq
  753.     cmp.w    8(a0),d0
  754.     blt.s    mt_aaad
  755.     move.w    10(a0),d0
  756.     sub.w    d0,32(a6)
  757.     move.w    32(a6),d0
  758.     cmp.w    8(a0),d0
  759.     bgt    mt_anxt
  760.     move.w    8(a0),32(a6)
  761. mt_aaeq:move.w    #2,38(a6)
  762.     bra    mt_anxt
  763. mt_aaad:move.w    10(a0),d0
  764.     add.w    d0,32(a6)
  765.     move.w    32(a6),d0
  766.     cmp.w    8(a0),d0
  767.     blt    mt_anxt
  768.     move.w    8(a0),32(a6)
  769.     bra.s    mt_aaeq
  770. mt_anat:cmp.w    #2,38(a6)
  771.     bne.s    mt_ana2
  772.     move.w    32(a6),d0
  773.     cmp.w    12(a0),d0
  774.     beq.s    mt_a2eq
  775.     cmp.w    12(a0),d0
  776.     blt.s    mt_a2ad
  777.     move.w    14(a0),d0
  778.     sub.w    d0,32(a6)
  779.     move.w    32(a6),d0
  780.     cmp.w    12(a0),d0
  781.     bgt    mt_anxt
  782.     move.w    12(a0),32(a6)
  783. mt_a2eq:move.w    #3,38(a6)
  784.     bra    mt_anxt
  785. mt_a2ad:move.w    14(a0),d0
  786.     add.w    d0,32(a6)
  787.     move.w    32(a6),d0
  788.     cmp.w    12(a0),d0
  789.     blt    mt_anxt
  790.     move.w    12(a0),32(a6)
  791.     bra.s    mt_a2eq
  792. mt_ana2:cmp.w    #3,38(a6)
  793.     bne.s    mt_andc
  794.     move.w    32(a6),d0
  795.     cmp.w    16(a0),d0
  796.     beq.s    mt_adeq
  797.     cmp.w    16(a0),d0
  798.     blt.s    mt_adad
  799.     move.w    18(a0),d0
  800.     sub.w    d0,32(a6)
  801.     move.w    32(a6),d0
  802.     cmp.w    16(a0),d0
  803.     bgt.s    mt_anxt
  804.     move.w    16(a0),32(a6)
  805. mt_adeq:move.w    #4,38(a6)
  806.     move.w    20(a0),40(a6)
  807.     bra.s    mt_anxt
  808. mt_adad:move.w    18(a0),d0
  809.     add.w    d0,32(a6)
  810.     move.w    32(a6),d0
  811.     cmp.w    16(a0),d0
  812.     blt.s    mt_anxt
  813.     move.w    16(a0),32(a6)
  814.     bra.s    mt_adeq
  815. mt_andc:cmp.w    #4,38(a6)
  816.     bne.s    mt_anst
  817.     subq.w    #1,40(a6)
  818.     bpl.s    mt_anxt
  819.     move.w    #5,38(a6)
  820.     bra.s    mt_anxt
  821. mt_anst:move.w    24(a0),d0
  822.     sub.w    d0,32(a6)
  823.     bpl.s    mt_anxt
  824.     clr.l    30(a6)
  825.     clr.w    38(a6)
  826.     move.w    26(a6),$dff096
  827. mt_anxt:move.w    32(a6),d0
  828.     lsr.w    #2,d0
  829.     move.w    d0,8(a5)
  830.     move.w    28(a0),d0
  831.     add.w    d0,16(a6)
  832.     move.w    30(a0),d1
  833.     beq.s    mt_nvib
  834.     move.w    36(a6),d2
  835.     moveq    #0,d3
  836.     cmp.w    #360,d2
  837.     blt.s    mt_vibq
  838.     sub.w    #360,d2
  839.     moveq    #1,d3
  840. mt_vibq:lea    mt_amsinus,a2
  841.     muls    (a2,d2.w),d1
  842.     asr.w    #7,d1
  843.     tst.w    d3
  844.     beq.s    mt_nvib
  845.     neg.w    d1
  846. mt_nvib:add.w    16(a6),d1
  847.     move.w    d1,6(a5)
  848.     move.w    32(a0),d0
  849.     add.w    d0,d0
  850.     add.w    d0,36(a6)
  851.     cmp.w    #720,36(a6)
  852.     blt.s    mt_anrp
  853.     sub.w    #720,36(a6)
  854. mt_anrp:lea    $10(a5),a5
  855.     lea    42(a6),a6
  856.     dbra    d7,mt_amloop
  857.  
  858.     lea    mt_noisewave,a0
  859.     move.w    #$7327,d0
  860.     moveq    #31,d1
  861. mt_nlop:move.b    d0,(a0)+
  862.     add.b    $dff007,d0
  863.     eor.w    #124,d0
  864.     rol.w    #3,d0
  865.     dbra    d1,mt_nlop
  866.     rts
  867.  
  868. mt_periods:
  869.     dc.w    $358,$328,$2fa,$2d0,$2a6,$280,$25c,$23a,$21a,$1fc,$1e0
  870.     dc.w    $1c5,$1ac,$194,$17d,$168,$153,$140,$12e,$11d,$10d,$fe
  871.     dc.w    $f0,$e2,$d6,$ca,$be,$b4,$aa,$a0,$97,$8f,$87
  872.     dc.w    $7f,$78,$71,0
  873.  
  874. mt_speed:    dc.b    6
  875. mt_counter:    dc.b    0
  876. mt_pattpos:    dc.w    0
  877. mt_songpos:    dc.b    0
  878. mt_break:    dc.b    0
  879. mt_dmacon:    dc.w    0
  880. mt_samplestarts:dcb.l    $1f,0
  881. mt_voice1:    dcb.w    13,0
  882.         dc.w    1
  883.         dcb.w    7,0
  884. mt_voice2:    dcb.w    13,0
  885.         dc.w    2
  886.         dcb.w    7,0
  887. mt_voice3:    dcb.w    13,0
  888.         dc.w    4
  889.         dcb.w    7,0
  890. mt_voice4:    dcb.w    13,0
  891.         dc.w    8
  892.         dcb.w    7,0
  893.  
  894.     section    data,DATA_C
  895. mt_amsinus:
  896.     dc.w    0,2,4,6,8,$b,$d,$f,$11,$14,$16,$18,$1a,$1c,$1e,$21
  897.     dc.w    $23,$25,$27,$29,$2b,$2d,$2f,$32,$34,$36,$38,$3a,$3c,$3e
  898.     dc.w    $3f,$41,$43,$45,$47,$49,$4b,$4d,$4e,$50,$52,$53,$55,$57
  899.     dc.w    $58,$5a,$5c,$5d,$5f,$60,$62,$63,$64,$66,$67,$68,$6a,$6b
  900.     dc.w    $6c,$6d,$6e,$6f,$71,$72,$73,$74,$74,$75,$76,$77,$78,$79
  901.     dc.w    $79,$7a,$7b,$7b,$7c,$7c,$7d,$7d,$7e,$7e,$7e,$7f,$7f,$7f
  902.     dc.w    $7f,$7f,$7f,$7f,$80,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7e,$7e
  903.     dc.w    $7e,$7d,$7d,$7c,$7c,$7b,$7b,$7a,$79,$79,$78,$77,$76,$75
  904.     dc.w    $74,$73,$72,$71,$6f,$6e,$6d,$6c,$6b,$6a,$68,$67,$66,$64
  905.     dc.w    $63,$62,$60,$5f,$5d,$5c,$5a,$58,$57,$55,$53,$52,$50,$4e
  906.     dc.w    $4d,$4b,$49,$47,$45,$43,$41,$40,$3e,$3c,$3a,$38,$36,$34
  907.     dc.w    $32,$2f,$2d,$2b,$29,$27,$25,$23,$21,$1e,$1c,$1a,$18,$16
  908.     dc.w    $14,$11,$f,$d,$b,$8,$6,$4,$2,0
  909. mt_amwaveforms:
  910.     dc.b    0,25,49,71,90,106,117,125
  911.     dc.b    127,125,117,106,90,71,49,25
  912.     dc.b    0,-25,-49,-71,-90,-106,-117
  913.     dc.b    -125,-127,-125,-117,-106
  914.     dc.b    -90,-71,-49,-25
  915.     dc.b    -128,-120,-112,-104,-96,-88,-80,-72,-64,-56,-48
  916.     dc.b    -40,-32,-24,-16,-8,0,8,16,24,32,40,48,56,64,72,80
  917.     dc.b    88,96,104,112,120
  918.     dcb.b    16,-128
  919.     dcb.b    16,127
  920. mt_noisewave:
  921.     dcb.b    32,0
  922.  
  923.